```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Spring Boot全局异常处理指南</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            line-height: 1.8;
            color: #333;
        }
        .hero {
            background: linear-gradient(135deg, #6e48aa 0%, #9d50bb 100%);
        }
        .code-block {
            background: #2d3748;
            border-radius: 0.5rem;
            color: #e2e8f0;
        }
        .hover-scale {
            transition: all 0.3s ease;
        }
        .hover-scale:hover {
            transform: translateY(-2px);
            box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
        }
        .method-card {
            border-left: 4px solid #6e48aa;
        }
        .footer-links a:hover {
            color: #9d50bb;
        }
    </style>
</head>
<body class="bg-gray-50">
    <!-- Hero Section -->
    <section class="hero text-white py-20 px-4">
        <div class="container mx-auto max-w-6xl">
            <div class="flex flex-col md:flex-row items-center">
                <div class="md:w-1/2 mb-10 md:mb-0">
                    <h1 class="text-4xl md:text-5xl font-bold mb-4 leading-tight">Spring Boot <span class="text-yellow-300">全局异常处理</span></h1>
                    <p class="text-xl mb-8 opacity-90">构建健壮应用的异常处理策略与最佳实践</p>
                    <div class="flex space-x-4">
                        <a href="#methods" class="bg-white text-purple-700 px-6 py-3 rounded-lg font-semibold hover:bg-purple-100 transition duration-300">
                            <i class="fas fa-book mr-2"></i>学习方法
                        </a>
                        <a href="#comparison" class="border-2 border-white text-white px-6 py-3 rounded-lg font-semibold hover:bg-white hover:text-purple-700 transition duration-300">
                            <i class="fas fa-chart-bar mr-2"></i>方案对比
                        </a>
                    </div>
                </div>
                <div class="md:w-1/2 flex justify-center">
                    <div class="w-full max-w-md">
                        <div class="mermaid">
                            graph TD
                            A[Spring Boot异常处理] --> B[ControllerAdvice]
                            A --> C[ResponseStatus]
                            A --> D[RestControllerAdvice]
                            A --> E[HandlerExceptionResolver]
                            A --> F[ErrorController]
                            B --> G[集中处理多个异常]
                            D --> H[专为REST API设计]
                            E --> I[完全自定义处理]
                            F --> J[处理所有未捕获异常]
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <!-- Introduction -->
    <section class="py-16 px-4">
        <div class="container mx-auto max-w-4xl">
            <div class="bg-white rounded-xl shadow-lg p-8 hover-scale">
                <p class="text-xl leading-relaxed text-gray-700">
                    在 Spring Boot 中处理全局异常有多种方式，可以根据具体的需求选择合适的策略。对于大多数场景来说，<code class="bg-purple-100 text-purple-800 px-2 py-1 rounded">@ControllerAdvice</code> 或 <code class="bg-purple-100 text-purple-800 px-2 py-1 rounded">@RestControllerAdvice</code> 是最常用的方式，因为它们既方便又灵活，适合集中管理和处理应用中的异常。此外，通过合理配置和自定义异常处理逻辑，可以提高应用的健壮性和用户体验。
                </p>
            </div>
        </div>
    </section>

    <!-- Methods Section -->
    <section id="methods" class="py-16 px-4 bg-gray-100">
        <div class="container mx-auto max-w-6xl">
            <h2 class="text-3xl font-bold text-center mb-12 text-gray-800">异常处理方法详解</h2>
            
            <!-- Method 1 -->
            <div class="method-card bg-white rounded-lg shadow-lg overflow-hidden mb-10 hover-scale">
                <div class="p-6">
                    <div class="flex items-center mb-4">
                        <div class="bg-purple-100 text-purple-800 rounded-full w-10 h-10 flex items-center justify-center mr-4">
                            <i class="fas fa-code"></i>
                        </div>
                        <h3 class="text-2xl font-bold text-gray-800">1. 使用 <code>@ControllerAdvice</code> 和 <code>@ExceptionHandler</code> 注解</h3>
                    </div>
                    <p class="text-gray-600 mb-6">
                        <code>@ControllerAdvice</code> 是 Spring 提供的一个注解，用于定义全局的异常处理器。你可以在这个类中使用 <code>@ExceptionHandler</code> 注解来处理特定的异常类型。
                    </p>
                    <div class="code-block p-6 mb-6 overflow-x-auto">
                        <pre><code class="language-java">@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity&lt;String&gt; handleException(Exception e) {
        // 打印异常信息到日志
        e.printStackTrace();
        // 返回一个响应给客户端
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
               .body("服务器内部错误");
    }

    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity&lt;String&gt; handleNullPointerException(NullPointerException e) {
        e.printStackTrace();
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
               .body("空指针异常");
    }

    // 可以定义更多的异常处理方法...
}</code></pre>
                    </div>
                    <div class="bg-blue-50 p-4 rounded-lg border-l-4 border-blue-400">
                        <h4 class="font-bold text-blue-800 mb-2 flex items-center">
                            <i class="fas fa-check-circle mr-2"></i>优点
                        </h4>
                        <ul class="list-disc pl-5 text-blue-700">
                            <li>可以集中处理不同的异常，逻辑清晰</li>
                            <li>通过 <code>ResponseEntity</code> 返回自定义的 HTTP 状态码和响应消息</li>
                        </ul>
                    </div>
                </div>
            </div>
            
            <!-- Method 2 -->
            <div class="method-card bg-white rounded-lg shadow-lg overflow-hidden mb-10 hover-scale">
                <div class="p-6">
                    <div class="flex items-center mb-4">
                        <div class="bg-purple-100 text-purple-800 rounded-full w-10 h-10 flex items-center justify-center mr-4">
                            <i class="fas fa-tag"></i>
                        </div>
                        <h3 class="text-2xl font-bold text-gray-800">2. 使用 <code>@ResponseStatus</code> 注解</h3>
                    </div>
                    <p class="text-gray-600 mb-6">
                        <code>@ResponseStatus</code> 注解可以直接标注在自定义异常类上，指定 HTTP 状态码和响应消息。适用于简单的异常处理。
                    </p>
                    <div class="code-block p-6 mb-6 overflow-x-auto">
                        <pre><code class="language-java">@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {

    public ResourceNotFoundException(String message) {
        super(message);
    }
}</code></pre>
                    </div>
                    <div class="bg-blue-50 p-4 rounded-lg border-l-4 border-blue-400">
                        <h4 class="font-bold text-blue-800 mb-2 flex items-center">
                            <i class="fas fa-check-circle mr-2"></i>优点
                        </h4>
                        <ul class="list-disc pl-5 text-blue-700">
                            <li>简单且与异常类紧密结合，适合单一异常处理</li>
                            <li>不需要额外配置，全局异常处理更方便</li>
                        </ul>
                    </div>
                </div>
            </div>
            
            <!-- Method 3 -->
            <div class="method-card bg-white rounded-lg shadow-lg overflow-hidden mb-10 hover-scale">
                <div class="p-6">
                    <div class="flex items-center mb-4">
                        <div class="bg-purple-100 text-purple-800 rounded-full w-10 h-10 flex items-center justify-center mr-4">
                            <i class="fas fa-server"></i>
                        </div>
                        <h3 class="text-2xl font-bold text-gray-800">3. 使用 <code>@RestControllerAdvice</code> 注解</h3>
                    </div>
                    <p class="text-gray-600 mb-6">
                        <code>@RestControllerAdvice</code> 是 <code>@ControllerAdvice</code> 的一个变体，专门用于 RESTful API 的异常处理。它会自动在处理方法上加上 <code>@ResponseBody</code>，将异常处理结果作为 JSON 返回给客户端。
                    </p>
                    <div class="code-block p-6 mb-6 overflow-x-auto">
                        <pre><code class="language-java">@RestControllerAdvice
public class RestGlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity&lt;String&gt; handleValidationException(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getFieldErrors()
                       .stream()
                       .map(DefaultMessageSourceResolvable::getDefaultMessage)
                       .collect(Collectors.joining(", "));
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
               .body("参数验证失败: " + message);
    }

    // 其他异常处理...
}</code></pre>
                    </div>
                    <div class="bg-blue-50 p-4 rounded-lg border-l-4 border-blue-400">
                        <h4 class="font-bold text-blue-800 mb-2 flex items-center">
                            <i class="fas fa-check-circle mr-2"></i>优点
                        </h4>
                        <ul class="list-disc pl-5 text-blue-700">
                            <li>特别适合 REST API 开发，返回 JSON 格式的错误信息</li>
                            <li>自动封装响应体，简化异常处理逻辑</li>
                        </ul>
                    </div>
                </div>
            </div>
            
            <!-- Method 4 -->
            <div class="method-card bg-white rounded-lg shadow-lg overflow-hidden mb-10 hover-scale">
                <div class="p-6">
                    <div class="flex items-center mb-4">
                        <div class="bg-purple-100 text-purple-800 rounded-full w-10 h-10 flex items-center justify-center mr-4">
                            <i class="fas fa-cogs"></i>
                        </div>
                        <h3 class="text-2xl font-bold text-gray-800">4. 实现 <code>HandlerExceptionResolver</code> 接口</h3>
                    </div>
                    <p class="text-gray-600 mb-6">
                        你可以实现 <code>HandlerExceptionResolver</code> 接口来自定义异常处理逻辑。这种方式提供了更大的灵活性，但使用频率较低，因为 Spring 已经提供了足够多的注解方式来处理异常。
                    </p>
                    <div class="code-block p-6 mb-6 overflow-x-auto">
                        <pre><code class="language-java">public class CustomExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(
            HttpServletRequest request, 
            HttpServletResponse response, 
            Object handler, 
            Exception ex) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.setViewName("error"); // 指定一个视图页面
        return mav;
    }
}</code></pre>
                    </div>
                    <div class="bg-blue-50 p-4 rounded-lg border-l-4 border-blue-400">
                        <h4 class="font-bold text-blue-800 mb-2 flex items-center">
                            <i class="fas fa-check-circle mr-2"></i>优点
                        </h4>
                        <ul class="list-disc pl-5 text-blue-700">
                            <li>完全控制异常处理的逻辑和视图渲染</li>
                            <li>适用于需要自定义复杂异常处理逻辑的场景</li>
                        </ul>
                    </div>
                </div>
            </div>
            
            <!-- Method 5 -->
            <div class="method-card bg-white rounded-lg shadow-lg overflow-hidden hover-scale">
                <div class="p-6">
                    <div class="flex items-center mb-4">
                        <div class="bg-purple-100 text-purple-800 rounded-full w-10 h-10 flex items-center justify-center mr-4">
                            <i class="fas fa-exclamation-triangle"></i>
                        </div>
                        <h3 class="text-2xl font-bold text-gray-800">5. 自定义 <code>ErrorController</code></h3>
                    </div>
                    <p class="text-gray-600 mb-6">
                        Spring Boot 允许你自定义 <code>ErrorController</code> 来统一处理应用中的所有错误。默认情况下，Spring Boot 提供了一个基本的错误页面，但你可以通过实现 <code>ErrorController</code> 接口并覆盖 <code>error</code> 方法来自定义错误处理逻辑。
                    </p>
                    <div class="code-block p-6 mb-6 overflow-x-auto">
                        <pre><code class="language-java">@Controller
public class CustomErrorController implements ErrorController {

    @RequestMapping("/error")
    public ResponseEntity&lt;String&gt; handleError() {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
               .body("自定义错误信息");
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}</code></pre>
                    </div>
                    <div class="bg-blue-50 p-4 rounded-lg border-l-4 border-blue-400">
                        <h4 class="font-bold text-blue-800 mb-2 flex items-center">
                            <i class="fas fa-check-circle mr-2"></i>优点
                        </h4>
                        <ul class="list-disc pl-5 text-blue-700">
                            <li>覆盖默认的错误处理逻辑，提供更个性化的错误页面或响应</li>
                            <li>集中处理所有未捕获的异常</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <!-- Comparison Section -->
    <section id="comparison" class="py-16 px-4">
        <div class="container mx-auto max-w-6xl">
            <h2 class="text-3xl font-bold text-center mb-12 text-gray-800">异常处理方案对比</h2>
            <div class="bg-white rounded-xl shadow-lg overflow-hidden">
                <div class="mermaid p-6">
                    mindmap
                        root((Spring Boot异常处理))
                            注解方式
                                @ControllerAdvice
                                    :集中处理多个异常
                                    :灵活配置响应
                                    :适合Web应用
                                @ResponseStatus
                                    :简单易用
                                    :与异常类绑定
                                    :适合简单场景
                                @RestControllerAdvice
                                    :专为REST设计
                                    :自动JSON响应
                                    :简化API开发
                            编程方式
                                HandlerExceptionResolver
                                    :完全控制流程
                                    :自定义视图渲染
                                    :复杂场景适用
                                ErrorController
                                    :全局错误处理
                                    :覆盖默认行为
                                    :处理未捕获异常
                </div>
            </div>
        </div>
    </section>

    <!-- Best Practices -->
    <section class="py-16 px-4 bg-gray-100">
        <div class="container mx-auto max-w-4xl">
            <h2 class="text-3xl font-bold text-center mb-12 text-gray-800">最佳实践建议</h2>
            <div class="grid md:grid-cols-2 gap-8">
                <div class="bg-white p-8 rounded-lg shadow-lg hover-scale">
                    <div class="text-purple-600 mb-4 text-4xl">
                        <i class="fas fa-lightbulb"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4 text-gray-800">根据应用类型选择</h3>
                    <p class="text-gray-600">
                        对于传统的Web应用，<code>@ControllerAdvice</code>配合<code>@ExceptionHandler</code>是理想选择。如果是REST API开发，优先考虑<code>@RestControllerAdvice</code>，它能自动将错误信息转换为JSON格式。
                    </p>
                </div>
                <div class="bg-white p-8 rounded-lg shadow-lg hover-scale">
                    <div class="text-purple-600 mb-4 text-4xl">
                        <i class="fas fa-layer-group"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4 text-gray-800">分层处理异常</h3>
                    <p class="text-gray-600">
                        将业务异常与技术异常分开处理。业务异常通常需要展示给用户，而技术异常则应该记录日志并提供友好的错误提示，避免暴露系统内部细节。
                    </p>
                </div>
                <div class="bg-white p-8 rounded-lg shadow-lg hover-scale">
                    <div class="text-purple-600 mb-4 text-4xl">
                        <i class="fas fa-file-alt"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4 text-gray-800">统一错误响应格式</h3>
                    <p class="text-gray-600">
                        设计统一的错误响应对象，包含错误码、错误信息和可能的解决方案提示。这能显著提升API的可用性和调试效率。
                    </p>
                </div>
                <div class="bg-white p-8 rounded-lg shadow-lg hover-scale">
                    <div class="text-purple-600 mb-4 text-4xl">
                        <i class="fas fa-search-plus"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4 text-gray-800">日志记录策略</h3>
                    <p class="text-gray-600">
                        在异常处理器中合理记录错误日志，包括请求参数、用户信息等上下文数据，但要避免记录敏感信息。考虑使用MDC(Mapped Diagnostic Context)增强日志跟踪能力。
                    </p>
                </div>
            </div>
        </div>
    </section>

    <!-- Conclusion -->
    <section class="py-16 px-4">
        <div class="container mx-auto max-w-4xl">
            <div class="bg-gradient-to-r from-purple-500 to-indigo-600 text-white rounded-xl p-8 shadow-lg">
                <h2 class="text-2xl font-bold mb-4">总结</h2>
                <p class="mb-6">
                    Spring Boot提供了多种灵活的异常处理机制，开发者可以根据项目需求和架构风格选择最合适的方案。<code>@ControllerAdvice</code>和<code>@RestControllerAdvice</code>适合大多数场景，能有效集中管理异常处理逻辑。对于特殊需求，可以通过实现<code>HandlerExceptionResolver</code>或自定义<code>ErrorController</code>来实现更精细的控制。
                </p>
                <p>
                    良好的异常处理不仅能提升应用的健壮性，还能改善用户体验。建议结合日志记录、监控告警等机制，构建完整的错误处理体系。
                </p>
            </div>
        </div>
    </section>

    <!-- Footer -->
    <footer class="bg-gray-900 text-gray-300 py-12 px-4">
        <div class="container mx-auto max-w-6xl">
            <div class="flex flex-col md:flex-row justify-between items-center">
                <div class="mb-6 md:mb-0">
                    <h3 class="text-xl font-bold text-white mb-2">技术小馆</h3>
                    <p class="text-gray-400">专业的开发技术分享平台</p>
                </div>
                <div class="footer-links">
                    <a href="http://www.yuque.com/jtostring" class="text-gray-300 hover:text-purple-400 transition duration-300">
                        <i class="fas fa-external-link-alt mr-2"></i>访问技术小馆
                    </a>
                </div>
            </div>
            <div class="border-t border-gray-800 mt-8 pt-8 text-center text-gray-500">
                <p>© 2023 技术小馆. 保留所有权利.</p>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            },
            mindmap: {
                useMaxWidth: true
            }
        });
    </script>
</body>
</html>
```